/**
 * @param {number[][]} rooms
 * @return {void} Do not return anything, modify rooms in-place instead.
 */
var wallsAndGates = function(rooms) {
  let row = rooms.length, col = rooms[0].length, direction = [[0, 1], [1, 0], [-1, 0], [0, -1]], visited = new Array(row);
  // 是否是门
  function isDoor(indexI, indexJ) {
    return rooms[indexI][indexJ] == 0;
  }
  // 是否是墙
  function isWall(indexI, indexJ) {
    return rooms[indexI][indexJ] == -1;
  }
  // 是否是陆地
  function isLand(indexI, indexJ) {
    return !isWall(indexI, indexJ) && !isDoor(indexI, indexJ);
  }
  // 是否为有效区域
  function isValid(indexI, indexJ) {
    return (indexI >= 0 && indexI < row) && (indexJ >= 0 && indexJ < col);
  }

  function initVisited() {
    for(let i = 0; i < row; i++) {
      visited[i] = new Array(col).fill(false);
    }
  }
  // 广搜
  function bfs(indexI, indexJ) {
    let queue = [];
    for(let i = 0; i < direction.length; i++) {
      let x = indexI + direction[i][0], y = indexJ + direction[i][1];
      if(isValid(x, y) && isLand(x, y)) {
        queue.push({
          x,
          y,
          depth: 1
        });
      }
    }
    while(queue.length) {
      let obj = queue.shift();
      // console.log("obj", obj);
      // console.log("obj", obj);
      const { x, y, depth } = obj;
      // console.log(x, y, depth);
      // 如果原来的距离就比这个小，那么直接可以跳过，不用继续走下去
      if(rooms[x][y] < depth) continue;
      rooms[x][y] = depth;
      for(let i = 0; i < direction.length; i++) {
        let newX = x + direction[i][0], newY = y + direction[i][1];
        if(isValid(newX, newY) && isLand(newX, newY) && rooms[newX][newY] > depth + 1 && !visited[newX][newY]) {
          visited[newX][newY] = true;
          queue.push({
            x: newX,
            y: newY,
            depth: depth + 1
          });
        }
      }
    }
  }

  for(let i = 0; i < row; i++) {
    for(let j = 0; j < col; j++) {
      initVisited();
      // 找到门
      if(rooms[i][j] == 0) {
        bfs(i, j);
      }
    }
  }
  return rooms;
};
let rooms = [[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]];
console.log(wallsAndGates(rooms));
rooms = [[-1]];
console.log(wallsAndGates(rooms));
rooms = [[2147483647]];
console.log(wallsAndGates(rooms));
rooms = [[0]];
console.log(wallsAndGates(rooms));
rooms =
[[0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0,2147483647],[2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,0]];
console.log(wallsAndGates(rooms));
